//
//  WKStatusViewModel.swift
//  WKWeibo
//
//  Created by 恋guang年 on 16/3/29.
//  Copyright © 2016年 恋guang年. All rights reserved.
//
//VM中就是处理模型操作 请求模型数据 字典转模型等操作
import UIKit
import SDWebImage

class WKStatusViewModel: NSObject {
    //单列 外面只有拿到我这个单列就可以加载微博模型数据
    static let sharedInstance:WKStatusViewModel = WKStatusViewModel()
    
    ///加载微博模型数据
    func loadStatuses(since_id:Int64 ,max_id:Int64, loadStatusesCallBack:(statuses:[WKStatus]?,error:NSError?) ->()){
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
         // 请求参数
        var  parameters: [String : AnyObject] = ["access_token":  WKUserAccountViewModel.sharedInstance.userAccount!.access_token!]
        // 表示别人传递了since_id需要下拉刷新,返回比since_id大的微博
        // 注意: 字典里面的key不能直接传递Int64
        if since_id > 0 {
            parameters["since_id"] = NSNumber(longLong: since_id)
        } else if max_id > 0 {
            // 比人传递了max_id.添加到字典里面
            parameters["max_id"] = NSNumber(longLong: max_id - 1)
        }
        
        
        WKNetWorkTool.sharedInstance.requestGET(urlString, parameters: parameters) { (result, error) -> () in
            if error != nil{
                 print("获得微博数据出错:\(error)")
                loadStatusesCallBack(statuses:nil, error:error)
                return
            }
            //获得模型数组
            let statusArr = result!["statuses"] as! [[String:AnyObject]]
            //可变数组
            var statuses = [WKStatus]()
            //遍历字典数组 字典转模型
            for dict in statusArr{
                let status = WKStatus(dict:dict)
                statuses.append(status)
            }
            // tableView还没有显示
            // 当字典转模型完成后,来缓存微博模型里面的图片,当微博里面的图片缓存完成了,才通知控制器来显示微博数据
            self.cacheWebImage(statuses, loadStatusesCallBack: loadStatusesCallBack)
            // 字典转模型完成了,通知控制器把微博数据数组传给控制器
            //loadStatusesCallBack(statuses:statuses, error: nil)
        }
    }
    
    //缓存微博图片
    func cacheWebImage(statuses:[WKStatus] ,loadStatusesCallBack:(statuses:[WKStatus]?,error:NSError?) ->()){
        //创建group
        let group = dispatch_group_create()
        var length:CGFloat = 0
        //查找微博里的图片下载下来
        // 不管微博模型里面有几张图片都缓存,会导致缓存图片时间太长了.
        // 只需要缓存一张图片,即没赋值给cell之前就把一张图片的下载下来多张图片的不需要管,可要在cell即将显示的时候SDWebImage会自己去下载
        for status in statuses{
            //需要下载的图片路径数组
            var downloadURLs = status.storeImageURLs
            if downloadURLs == nil {
                //如果原创没有就去看看被转发的有没有
                downloadURLs = status.retweeted_status?.storeImageURLs
            }
            if downloadURLs == nil {
                // 说明原创没有图片,被转发的也没有图片
                continue
            }
            // 能到下面来说明有图片需要下载,不管微博模型里面有几张图片都缓存,会导致缓存图片时间太长了.
            // 只需要缓存一张图片,多张图片的不需要管,可要在cell即将显示的时候SDWebImage会自己去下载
            if downloadURLs?.count == 1 {
                let imgURL = downloadURLs![0]
                // 在异步任务之前进入组
                dispatch_group_enter(group)
                //用SDWebImage下载单图 缓存起来
                SDWebImageManager.sharedManager().downloadWithURL(imgURL, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _) -> Void in// SDWebImage下载完成图片的时候的回调
                    // 不管是下载成功还是失败,任务都完成了.就需要离开组
                    dispatch_group_leave(group)
                    if error != nil {
                        print("下载单张图片出错")
                        return
                    }
//                    print("单张图片下载成功")
                    let data = UIImagePNGRepresentation(image)!
                    length += CGFloat(data.length)
                 
                })
                
            }
            
        }
        // 所有模型的图片都下载完成才通知我
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("所有单张图片缓存结束")
            //所有单张图片缓存完通知控制器加载微博数据
            loadStatusesCallBack(statuses: statuses, error: nil)
        }
    }
    
}













